<?php

namespace App\common\service;

use app\common\utils\JsonResponse;
use TencentCloud\Common\Credential;
use TencentCloud\Asr\V20190614\AsrClient;
use TencentCloud\Asr\V20190614\Models\SentenceRecognitionRequest;
use think\facade\Db;
use TencentCloud\Common\Exception\TencentCloudSDKException;
use TencentCloud\Common\Profile\ClientProfile;
use TencentCloud\Common\Profile\HttpProfile;

class TencentService
{
    private $appId = "1257696216";
    private $secretId = "AKIDeP2WqJyYw74rVxKYbQnonZDgx3xfATYP";
    private $secretKey =  "g9PGxUt55ufIk19D9Yt9MRK5nOp6pgPv";

    /**
     * 语音识别函数，识别一句话并返回识别结果
     *
     * @param string $audioBase64 语音文件的 Base64 编码数据
     */
    public function recognizeSpeechFromBase64($uid, $audioBase64, $EngSerViceType="16k_zh", $VoiceFormat = "wav", $SubServiceType = 2)
    {
        Db::startTrans();
        $insert_id = $this->saveAudioRecord($uid, $audioBase64);
        if (!$insert_id){
            Db::rollback();
            return JsonResponse::error('保存失败');
        }

        // 初始化腾讯云 API 客户端
        $cred = new Credential($this->secretId, $this->secretKey);
        $client = new AsrClient($cred, "ap-guangzhou");

        // 创建请求对象
        $req = new SentenceRecognitionRequest();
        $req->setProjectId(0);  // 设置项目 ID
        $req->setSubServiceType($SubServiceType);  // 设置子服务类型 2（一句话识别）
        $req->setEngSerViceType($EngSerViceType);  // 设置语言类型，例如 16k 采样率的普通话
        $req->setSourceType(1);  // 设置音频来源 1（音频数据）
        $req->setVoiceFormat($VoiceFormat);  // 设置音频格式

        // 设置 Base64 编码的音频数据
        $req->setData($audioBase64);

        // 发送请求
        $response = $client->SentenceRecognition($req);
        $result = $response->serialize();

        if (isset($result['Result'])) {
            $r = $this->updateAudioText($insert_id, $result['Result']);
            if(!$r){
                Db::rollback();
                return JsonResponse::error('保存失败');
            }
            Db::commit();
            return JsonResponse::success($result['Result']);//return Json($result['Result']);
        } else {
            $r = $this->updateAudioText($insert_id, json_encode($result));
            if(!$r){
                Db::rollback();
                return JsonResponse::error('保存失败');
            }
            Db::commit();
            return JsonResponse::success('保存成功，但是识别失败');
//            return _error("识别失败");
        }
    }


    /**
     * 保存音频数据
     *
     * @param int $userId 用户ID
     * @param string $audioBase64 音频Base64编码
     * @param string|null $audioText 音频文本（可选）
     */
    public function saveAudioRecord(int $userId, string $audioBase64): int
    {
        $data=['user_id'=>$userId,'audio_base64'=>$audioBase64];
        $id = Db::name('audio_records')->insertGetId($data);
        if(!$id){
            return false;
        }
        // 返回插入的ID
        return $id;
    }

    /**
     * 根据ID更新音频文本
     *
     * @param int $id 音频记录的ID
     * @param string $audioText 新的音频文本
     * @return bool 更新是否成功
     */
    public function updateAudioText(int $id, string $audioText): bool
    {
        if (empty($id)) return false;
        // 查找记录
        $record = Db::name('audio_records')->where('id',$id)->find();
        if (!$record) {
            return false; // 记录不存在
        }
        if(Db::name('audio_records')->where('id',$id)->update(['audio_text'=>$audioText,'updated_at'=>time()])===false){
            return false; // 保存失败
        }

        return true;
    }

    /**
     * 语音识别函数，识别一句话并返回识别结果
     *
     * @param string $audioBase64 语音文件的 Base64 编码数据
     */
    public function SpeechFromBase64($audioBase64, $EngSerViceType="16k_zh", $VoiceFormat = "wav", $SubServiceType = 2)
    {
        try{
            // 初始化腾讯云 API 客户端
            $cred = new Credential($this->secretId, $this->secretKey);
            // 初始化Http配置
            $httpProfile = new HttpProfile();
            $httpProfile->setEndpoint("asr.tencentcloudapi.com");

            // 初始化客户端配置
            $clientProfile = new ClientProfile();
            $clientProfile->setHttpProfile($httpProfile);

            // 初始化客户端
            $client = new AsrClient($cred, "ap-guangzhou", $clientProfile);
    //        // 创建请求对象
            $req = new SentenceRecognitionRequest();
            $req->setProjectId(0);  // 设置项目 ID
            $req->setSubServiceType($SubServiceType);  // 设置子服务类型 2（一句话识别）
            $req->setEngSerViceType($EngSerViceType);  // 设置语言类型，例如 16k 采样率的普通话
            $req->setSourceType(1);  // 设置音频来源 1（音频数据）
            $req->setVoiceFormat($VoiceFormat);  // 设置音频格式
            // 设置 Base64 编码的音频数据
            $req->setData($audioBase64);
            // 发送请求
            $response = $client->SentenceRecognition($req);
            $result = $response->serialize();

            return $result;
        }catch(\Exception $e){
            return $e->getMessage();
        }
    }


}